Solving 10385 - Duathlon (Ternary search)
[andmenj-acm.git] / 357 - Let me count the ways / p357.cpp
bloba2360b3bb6ef5a367dfedb45b2f0f696ff6a1132
1 #include <iostream>
3 using namespace std;
5 #define M 3
6 int m[] = {1,2, 5};//, 10, 25, 50};
8 long long f(const int &n, const int &i){
9 if (n < 0){
10 printf("f(%d,%d) retornando 0\n", n, i);
11 return 0;
13 if (n <= 1 || i == 1){
14 printf("f(%d,%d) retornando 1\n", n, i);
15 return 1;
17 long long r=0;
18 for (int j=1; j<=M; ++j)
19 r += f(n-m[j-1], j);
20 printf("f(%d,%d) retornando %lld\n", n, i, r);
21 return r;
24 long long f(const int &n){
25 //printf("n es: %d\n", n);
26 if (n < 0) return 0;
27 if (n <= 1) return 1;
30 int pisoMonetario = 9999;
31 for (int i=M-1; n < pisoMonetario; --i)
32 pisoMonetario = m[i];
33 //pisoMonetario tiene la moneda más proxima hacia abajo
35 //printf("pisoMonetario es: %d\n", pisoMonetario);
37 long long r=0;
38 for (int i=0; i<M; ++i){
39 //printf("i es: %d\n", i);
40 //printf("m[i] es: %d\n", m[i]);
41 if (n - m[i] > pisoMonetario)
42 r += f(n - m[i]);
44 return r;
48 int main(){
49 int n;
50 while (scanf("%d", &n) == 1){
51 cout << f(n, M) << endl;
53 return 0;